package VideoJuego;

/*Desarrolladores:
 *Equipo: The Dream Team
 *José Francisco Ruiz Martínez 		A01166298
 *José Héctor Bermúdez Robles		A01161142
 *Arturo Ramírez Morales			A01165819
 * @version 1.0  Septiembre 2010
 */

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 * Esta clase se encarga de manejar todos los Sprites del personaje y de la
 * posición en la que se tiene que mostrar en la pantalla
 * 
 */
public class Personaje extends Sprite {

    private int[] secuenciaIzq = {0, 0, 0, 0, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1};  //Personaje se mueve a la Izquierda
    private int[] secuenciaDer = {0, 0, 0, 0, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6};   //Personaje se mueve a la derecha;
    private Sprite derecha;
    private Sprite izquierda;
    private int posicionAncho=0;
    private int posicionAlto=0;
    private int mover=0;
    private int estadoMov=0;
    private boolean brincando=false;

    /**
     * En el constructor recibe una X y Y, el ancho y Alto de la
     * pantalla  y el archivo para la imagen del personaje
     *
     * @param x asigna la posición x del personaje en la pantalla
     * @param y asigna la posición y del personaje en la pantalla
     * @param archivo nombre de la imagen
     * @throws IOException si no puede cargar la imagen lanza una excepción
     */
    public Personaje(int x, int y, String archivo) throws IOException {

        super(Image.createImage(archivo), 100, 100);
        super.setPosition(x, y);


        izquierda = new Sprite(Image.createImage(archivo), 100, 100);
        izquierda.setPosition(x, y);
        izquierda.setFrameSequence(secuenciaIzq);
        brincando = false;
        derecha = new Sprite(Image.createImage(archivo), 100, 100);
        derecha.setPosition(x, y);
        derecha.setFrameSequence(secuenciaDer);
        mover = 2;
        posicionAlto = x;
        posicionAncho = y;
        estadoMov = -5;
    }

    /**
     *  Este método se encarga de dibujar el personaje dependiendo de como se mueva
     * @param g En donde se va a dibujar el personaje
     */
    public void dibujar(Graphics g) {

        if (mover == 2) {
            derecha.paint(g);
        } else if (mover == 1) {
            izquierda.paint(g);
        } else {
            paint(g);
        }


    }

    /**
     * Este método recibe un estado para ver lo que se quiere hacer con el personaje
     * dependiendo del botón que se presione: Saltar, derecha e izquierda
     *
     * @param estadoMover Indica la acción que tiene que seguir el personaje
     */
    public void actualizar(int estadoMover) {

        switch (estadoMover) {
            case 1:
                if(this.getRefPixelY()<=0){
                    break;
                }
                if (izquierda.getFrame() != secuenciaIzq.length - 1) {
                    derecha.setFrame(0);
                    mover = 1;
                    izquierda.nextFrame();
                } else {
                    izquierda.move(0, -4);
                    posicionAlto = izquierda.getX();
                    posicionAncho = izquierda.getY();
                    derecha.setPosition(posicionAlto, posicionAncho);
                    setX(posicionAlto);
                    setY(posicionAncho);
                }

                break;
            case 2:
                 if(this.getRefPixelY()>=(640-this.getWidth())){
                     break;
                     }
                if (derecha.getFrame() != secuenciaDer.length - 1) {
                    izquierda.setFrame(0);
                    mover = 2;
                    derecha.nextFrame();
                } else {
                    derecha.move(0, 4);
                    posicionAlto = derecha.getX();
                    posicionAncho = derecha.getY();
                    izquierda.setPosition(posicionAlto, posicionAncho);
                    setX(posicionAlto);
                    setY(posicionAncho);
                }
                break;

            case 3:

                if (izquierda.getFrame() != 0) {
                    izquierda.prevFrame();
                } else if (derecha.getFrame() != 0) {
                    derecha.prevFrame();
                } else {
                    mover = 0;
                    estadoMov = -5;
                    setPosition(1, posicionAncho);
                }

                break;

            case 4:
                if (estadoMov != 5) {
                    int j = 0;
                    j = 25 - (estadoMov * estadoMov);

                    izquierda.setPosition (j, posicionAncho);
                    derecha.setPosition(j,posicionAncho);
                    setPosition(j, posicionAncho);
                    estadoMov++;
                } else {
                    izquierda.setPosition(1,posicionAncho);
                    derecha.setPosition(1, posicionAncho);
                    setPosition(1, posicionAncho);
                }
                break;

            default:
                break;
        }
    }

    /**
     * Se asigna una nueva posición en x
     * @param x posición en la que se quiere asignar con respecto a x
     */
    public void setX(int x) {
        setPosition(x, getY());
    }

    /**
     * Se asigna una nueva posición en y
     * @param y posición en la que se quiere asignar con respecto a y
     */
    public void setY(int y) {
        setPosition(getX(), y);
    }

    /**
     * Regresa la altura del sprite del personaje
     * @return altura del Sprite
     */
    public int getAlto() {
        return super.getHeight();
    }

    /**
     * Regrese el ancho del sprite del personaje
     * @return ancho del sprite
     */
    public int getAncho() {
        return super.getWidth();
    }

    /**
     *Saca un arma de la bolsa y la lanza al contrincante
     */
    public void disparar() {
    }

    /**
     * Si la bolsa esta vacia se activa un sonido para informarle al usuario
     */
    public void burlar() {
    }

    /**
     * Si es atacado con algún arma sigue una secuencia para detenerse
     */
    public void girar() {
    }

    public void destruir(){
    derecha=null;
    izquierda=null;
    posicionAncho=0;
    posicionAlto=0;
    mover=0;
    estadoMov=0;
    brincando=false;
    }
}
